package br.com.freelancer.util;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.Format;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 * versao 1.0
 * 
 * @autor Cristiano Silveira
 */

public abstract class DateUtil {

	/**
	 * 
	 * @param mascara
	 *            mascara tipo yyyy-mm-dd hh:mm:ss
	 * @param data
	 *            uma variavel data
	 * @return retorna uma string com a mascara data formatada
	 */
	public static String Formatar(String mascara, Date data) {
		if (data == null) {
			return "";
		}
		Format formato = new SimpleDateFormat(mascara);
		return formato.format(data.getTime());
	}

	/**
	 * Adiciona um determinado numero de dias a uma Calendar
	 * 
	 * @param calendar
	 *            instancia de Calendar
	 * @param dias
	 *            numero de dias a adicionar
	 * @return retorna um Calendar com os dias somados
	 */
	public static Calendar addDias(Calendar calendar, int dias) {
		calendar.add(Calendar.DAY_OF_MONTH, dias);
		return calendar;
	}

	/**
	 * Adiciona um determinado numero de dias a uma String
	 * 
	 * @param data
	 *            String com uma data valida
	 * @param dias
	 *            numero de dias a adicionar
	 * @return retorna uma string com os dias somados
	 */
	public static String addDias(String data, int dias) {
		Calendar calendar = stringToCalendar(data);
		calendar = addDias(calendar, dias);

		String dataStr = Formatar("dd/MM/yy", calendar.getTime());
		return dataStr;
	}

	/**
	 * Verifica se a data é valida ou nao
	 * 
	 * @param dateStr
	 *            data a ser validada
	 * @return retorna true ou false
	 */
	public static boolean validarData(String dateStr) {
		DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
		// definindo que se mesmo que a formatacao esteja certa ams a data
		// errada, da false
		df.setLenient(false);
		Calendar cal = new GregorianCalendar();
		try {
			// gerando o calendar
			cal.setTime(df.parse(dateStr));
		} catch (ParseException ex) {
			JOptionPane.showMessageDialog(null, "Data invalida!!");
			return false;
		}

		// separando os dados da string para comparacao e validacao
		String[] data = dateStr.split("/");
		String dia = data[0];
		String mes = data[1];
		String ano = data[2];

		// testando se hah discrepancia entre a data que foi
		// inserida no caledar e a data que foi passada como
		// string. se houver diferenca, a data passada era
		// invalida
		if ((new Integer(dia)).intValue() != (new Integer(
				cal.get(Calendar.DAY_OF_MONTH))).intValue()) {
			// dia nao casou
			return (false);
		} else if ((new Integer(mes)).intValue() != (new Integer(
				cal.get(Calendar.MONTH) + 1)).intValue()) {
			// mes nao casou
			return (false);
		} else if ((new Integer(ano)).intValue() != (new Integer(
				cal.get(Calendar.YEAR))).intValue()) {
			// ano nao casou
			return (false);
		}

		return (true);
	}

	/**
	 * 
	 * @return uma instancia de Calendar com a data atual do computador
	 */
	public static Calendar getDataAtualCalendar() {
		Date date = new Date();
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c;
	}

	public static Timestamp getDataAtualTimeStamp() {
		return new Timestamp(getDataAtualCalendar().getTimeInMillis());
	}

	public static Date getDataAtualDate() {
		return new Timestamp(getDataAtualCalendar().getTimeInMillis());
	}

	public static Timestamp getDataAtualTimeStampHoraZero() {
		try {
			return stringToTimeStamp(Formatar("dd/MM/yyyy",
					getDataAtualCalendar().getTime()));
		} catch (ParseException ex) {
			Logger.getLogger(DateUtil.class.getName()).log(Level.SEVERE, null, ex);
		}
		return null;
	}

	public static Calendar stringToCalendar(String data) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(stringToDate(data));
		return cal;
	}

	public static Date stringToDate(String data) {
		try {
			DateFormat formatter;
			Date date;
			formatter = new SimpleDateFormat("dd/MM/yyyy");
			date = (Date) formatter.parse(data);
			return date;
		} catch (ParseException e) {
			System.out.println("Exception :" + e);
		}
		return null;
	}

	public static java.sql.Date stringToSqlDate(String data) {
		return new java.sql.Date(stringToCalendar(data).getTimeInMillis());
	}

	public static Timestamp stringToTimeStamp(String data)
			throws ParseException {
		SimpleDateFormat sdf;
		if (data.length() == 19) {
			sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
		} else {
			sdf = new SimpleDateFormat("dd/MM/yyyy");
		}
		Date date = null;
		date = sdf.parse(data);

		return new java.sql.Timestamp(date.getTime());
	}

	public static Timestamp dateToTimeStamp(Date data) {
		try {
			return stringToTimeStamp(Formatar("dd/MM/yyyy", data));
		} catch (ParseException ex) {
			Logger.getLogger(DateUtil.class.getName()).log(Level.SEVERE, null, ex);
		}
		return null;
	}

	public static String getDiaSemanaExtenso(Calendar data) {
		switch (data.get(Calendar.DAY_OF_WEEK)) {
		case Calendar.SUNDAY:
			return "Domingo";
		case Calendar.MONDAY:
			return "Segunda Feira";
		case Calendar.TUESDAY:
			return "Terça Feira";
		case Calendar.WEDNESDAY:
			return "Quarta Feira";
		case Calendar.THURSDAY:
			return "Quinta Feira";
		case Calendar.FRIDAY:
			return "Sexta Feira";
		case Calendar.SATURDAY:
			return "Sábado";
		}
		return null;
	}
}